#include "NetCal.hpp"
#include "Protocol.hpp"
#include "TcpServer.hpp"
#include "Daemon.hpp"
#include <memory>

// ./tcpserver server_port
int main(int argc, char* argv[])
{
    if(argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " server_port" << std::endl;
        exit(USAGE_ERROR);
    }

    std::cout << "服务器已经启动，已经是一个守护进程了" << std::endl;
    Daemon(0,0); // daemon(0,0);

    // Enable_Console_Log_Strategy();
    Enable_File_Log_Strategy(); // 向文件里打印日志

    uint16_t server_port = std::stoi(argv[1]);

    // 应用层 具体功能的执行
    std::unique_ptr<NetCal> net_cal = std::make_unique<NetCal>();

    // 表示层 数据格式的转化
    std::unique_ptr<Protocol> protocol = std::make_unique<Protocol>([&net_cal](Request& req){
        return net_cal->Execute(req);
    });

    // 会话层 通信连接的管理
    std::unique_ptr<TcpServer> tcp_server = std::make_unique<TcpServer>(server_port,
    [&protocol](std::shared_ptr<Socket>& sockfd, const InetAddr &client){
        protocol->GetRequest(sockfd,client);
    });

    tcp_server->Start();

    return 0;
}